const oAuthURL = 'https://accounts.google.com/o/oauth2/auth';
const tokenURL = 'https://accounts.google.com/o/oauth2/token';
const sslScope = 'https://www.googleapis.com/auth/youtube.force-ssl';
var scriptProperties = PropertiesService.getScriptProperties();
const clientId = scriptProperties.getProperty('CLIENT_ID');
const yHandle = scriptProperties.getProperty('YOUTUBE_HANDLE');
const channelId = scriptProperties.getProperty('YOUTUBE_CHANNEL_ID');
const sheetId = scriptProperties.getProperty('SHEET_ID');

function getYouTubeService() {
  return OAuth2.createService('YouTube')
    .setAuthorizationBaseUrl(oAuthURL)
    .setTokenUrl(tokenURL)
    .setClientId(clientId)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope(sslScope)
    .setParam('access_type', 'offline')
    .setParam('approval_prompt', 'force')
    .setParam('login_hint', Session.getActiveUser().getEmail());
}

function authCallback(request) {
  var youtubeService = getYouTubeService();
  var isAuthorized = youtubeService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('인증에 성공하였습니다. 이 창을 종료 후, 앱스크립트 편집기로 돌아가도 괜찮습니다.');
  } else {
    return HtmlService.createHtmlOutput('인증 과정에 오류가 발생했습니다. 다시 시도하세요.');
  }
}

function 답글생성하기() {
  generateReplies();
}

function 댓글불러오기() {
  var youtubeService = YouTube.CommentThreads;

  var sheet = SpreadsheetApp.openById(sheetId).getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastTimestamp = lastRow > 1 ? new Date(sheet.getRange(lastRow, 6).getValue()) : null;

  var videoResponse = youtubeService.list('snippet,replies', {
    allThreadsRelatedToChannelId: channelId,
    maxResults: 100
  });

  var commentThreads = [];

  for (var i = 0; i <= videoResponse.items.length - 1 ; i++) {
    var item = videoResponse.items[i];
    var videoId = item.snippet.videoId;
    
    if (!videoId) {
      Logger.log('잘못된 Video ID 입니다. : ' + videoId);
      continue;
    }
    
    var videoDetails = YouTube.Videos.list('snippet', {
      id: videoId
    }).items[0];
    
    if (!videoDetails) {
      Logger.log('영상 설명을 찾을 수 없습니다. : ' + videoId);
      continue;
    }
    
    if (item.snippet.topLevelComment.snippet.authorDisplayName != yHandle) {
      commentThreads.unshift([
        item.snippet.topLevelComment.id,
        videoDetails.snippet.title,
        videoDetails.snippet.description,
        item.snippet.topLevelComment.snippet.textDisplay.replace(/<[^>]*>/g, ''),
        item.snippet.topLevelComment.snippet.authorDisplayName,
        item.snippet.topLevelComment.snippet.publishedAt
      ]);
    }

    if (item.replies) {
      for (var j = 0; j <= item.replies.comments.length - 1; j++) {
        var reply = item.replies.comments[j];
        if (reply.snippet.authorDisplayName != yHandle) {
          commentThreads.unshift([
            reply.id,
            videoDetails.snippet.title,
            videoDetails.snippet.description,
            reply.snippet.textDisplay.replace(/<[^>]*>/g, ''),
            reply.snippet.authorDisplayName,
            reply.snippet.publishedAt
          ]);
        }
      }
    }

  }

  var newCommentThreads = lastTimestamp ? commentThreads.filter(function(comment) {
    var commentTimestamp = new Date(comment[5]);
    return commentTimestamp > lastTimestamp;
  }) : commentThreads;

  newCommentThreads.sort(function(a, b) {
    var timeA = new Date(a[5]);
    var timeB = new Date(b[5]);
    return timeA - timeB;
  });
  
  if (newCommentThreads.length > 0) {
    sheet.getRange(lastRow + 1, 1, newCommentThreads.length, newCommentThreads[0].length).setValues(newCommentThreads);
  }
}

function 답글업로드하기() {
  var sheet = SpreadsheetApp.openById(sheetId).getActiveSheet();
  var lastRow = sheet.getLastRow();
  var idIndex = 1;
  var replyIndex = 9;
  var statusIndex = 7;

  var youtubeService = YouTube.Comments;

  for (var i = lastRow; i >= 2; i--) {
    var commentId = sheet.getRange(i, idIndex).getValue();
    var reply = sheet.getRange(i, replyIndex).getValue();
    var status = sheet.getRange(i, statusIndex).getValue();

    if (status == 'O') {
      break;
    }

    Logger.log('Comment ID: ' + commentId);
    Logger.log('Original Reply: ' + reply);
    Logger.log('Status: ' + status);
    var topLevelCommentId = commentId.split('.')[0];

    if (reply.trim().length > 0 && status == '') {
      var resource = {
        snippet: {
          parentId: topLevelCommentId,
          textOriginal: reply
        }
      };

      try {
        youtubeService.insert(resource, 'snippet');
        sheet.getRange(i, statusIndex).setValue('O');
        Logger.log('ID의 답글을 성공적으로 게시했습니다. : ' + commentId);
      } catch (error) {
        Logger.log('해당 ID의 답글 게시 중 오류가 발생했습니다. : ' + commentId);
        Logger.log('오류 메시지 : ' + error.message);
      }
    } else {
      Logger.log('해당 ID의 답글이 비어있어 다음 답글로 넘어갑니다. : ' + commentId);
    }
  }
}